/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package kn.cstf2.global.Utils;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.util.*;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author Arturo De Leon Campos
 */
public class ConectaProperties implements Runnable {

    /**
     * Metodo que guarda la informacion en un propertie solo darle el nombre no
     * la extension, guarda el propertie y lo sobre escribe
     *
     * @param prop Nombre de la propiedad
     * @param nombre nombre del propertie a llamar
     * @param valor valor asignado al propertie
     */
    public void guardaProperties(String prop, String nombre, String valor) {
        Properties dbProps = new Properties();

        // Declaramos un InputStream para recibir los datos
        InputStream inputStream = null;
        String listo = "";
        URL url = ConectaProperties.class.getResource("/kn/cstf2/global/db/props/db");
      
        String path = url.getPath();
        path = path.substring(1, path.length());
        path = path.replace("%20", " ");
        try {

            //Cargamos el archivo 

            inputStream = new FileInputStream(path);
            dbProps.load(inputStream);
            inputStream.close();

            //obtenemos los valores del archivo y los asignamos a las variables
            listo = dbProps.getProperty(nombre);
        } catch (Exception e) {
            System.out.println("El archivo NO ha sido cargado exitosamente");
        }

        dbProps.setProperty(nombre, valor);
        FileOutputStream os = null;

        try {
            os = new FileOutputStream(path);
            dbProps.store(os, null);
        } catch (IOException ioe) {
            ioe.printStackTrace();
        } finally {

            try {
                if (os != null) {
                    os.close();
                }
            } catch (IOException ex) {
                Logger.getLogger(ConectaProperties.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }
    
    public void guardaPropertiesDb2(String prop, String nombre, String valor) {
        Properties dbProps = new Properties();

        // Declaramos un InputStream para recibir los datos
        InputStream inputStream = null;
        String listo = "";
        URL url = ConectaProperties.class.getResource("/kn/cstf2/global/db/props/db2");
      
        String path = url.getPath();
        path = path.substring(1, path.length());
        path = path.replace("%20", " ");
        try {

            //Cargamos el archivo 

            inputStream = new FileInputStream(path);
            dbProps.load(inputStream);
            inputStream.close();

            //obtenemos los valores del archivo y los asignamos a las variables
            listo = dbProps.getProperty(nombre);
        } catch (Exception e) {
            System.out.println("El archivo NO ha sido cargado exitosamente");
        }

        dbProps.setProperty(nombre, valor);
        FileOutputStream os = null;

        try {
            os = new FileOutputStream(path);
            dbProps.store(os, null);
        } catch (IOException ioe) {
            ioe.printStackTrace();
        } finally {

            try {
                if (os != null) {
                    os.close();
                }
            } catch (IOException ex) {
                Logger.getLogger(ConectaProperties.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }

    /**
     * Metodo que lee el valor por medio de un ResourceBundle solo es necesario
     * el nombre sin la extencion este libera el cache
     *
     * @param nombreProp nombre del propertie
     * @return Una coleccion con todos los valores del
     */
    public Map<String, String> leerProperties(String nombreProp) {
        Map<String, String> valores = new TreeMap<String, String>();
        ResourceBundle rb = ResourceBundle.getBundle(nombreProp);

        Enumeration<String> keys = rb.getKeys();
        if (keys != null) {
            while (keys.hasMoreElements()) {
                String key = keys.nextElement();
                valores.put(key, rb.getString(key));
            }
        }
        ResourceBundle.clearCache();
        return valores;
    }

    public String leerPropertiesOne(String nombreProp, String nombre) {
        String res = "";
        ResourceBundle rb = ResourceBundle.getBundle(nombreProp);
        res = (String) rb.getObject(nombre);
        return res;
    }

    //Ejemplos de como usar las propiedades
    public static void main(String[] args) {
        ConectaProperties con = new ConectaProperties();

//        Map<String, String> valores = con.leerProperties("BaseDatos");
//
//        for (Iterator it = valores.keySet().iterator(); it.hasNext();) {
//            System.out.println(valores.get((String) it.next()));
//        }
        
        System.out.println(con.buscaProperties("BaseDatos", "jdbc.driver"));

       
    }

    public void run() {
    }

    String buscaProperties(String nombreProp, String nombre) {
        String res = "";
        ResourceBundle rb = ResourceBundle.getBundle(nombreProp);
        res = (String) rb.getObject(nombre);
        if (res.equals("")) {
            res = "Fórmula no encontrada";
           // throw new RfclException("Fórmula no encontrada");
        }
        return res;
    }
}
